#include "SQLHexExpr.h"
#include "../../../sql/visitor/SQLASTVisitor.h"

SQLHexExpr::SQLHexExpr(string_ptr theHex)
{
  hex = theHex;
}
SQLHexExpr::~SQLHexExpr()
{
}

string_ptr SQLHexExpr::getHex()
{
  return hex;
}

void SQLHexExpr::output(std::stringstream *buf)
{
  // buf.append("0x");
  (*buf) << "0x";
  // buf.append(hex);
  (*buf) << *hex;

  string_ptr charset = make_string_ptr(getAttribute("USING")->getString());

  if (charset->c_str() != "")
  {
    ////buf.append(" USING ");
    (*buf) << " USING ";
    ////buf.append(charset);
    (*buf) << charset->c_str();
  }
}

void SQLHexExpr::accept0(SQLASTVisitor_ptr visitor)
{
  visitor->visit(SharedObject(SQLHexExpr));
  visitor->endVisit(SharedObject(SQLHexExpr));
}

// int SQLHexExpr::hashCode() {
// final int prime = 31;
// int result = 1;
// result = prime * result + ((hex == NULL) ? 0 : hex.hashCode());
// return result;
//}

// BOOL_ptr SQLHexExpr::equals(Object obj) {
// if (this == obj) {
// return BOOL::TRUE;
//}
// if (obj == NULL) {
// return BOOL::FALSE;
//}
// if (getClass() != obj.getClass()) {
// return BOOL::FALSE;
//}
// SQLHexExpr other = (SQLHexExpr) obj;
// if (hex == NULL) {
// if (other.hex != NULL) {
// return BOOL::FALSE;
//}
//} else if (!hex.equals(other.hex)) {
// return BOOL::FALSE;
//}
// return BOOL::TRUE;
//}

// char[] toBytes() {
// return HexBin.decode(hex);
//}

SQLObject_ptr SQLHexExpr::clone()
{
  // return new SQLHexExpr(hex);
  SQLObject_ptr clone_tmp = SQLHexExpr_ptr(new SQLHexExpr(hex));
  SQLHexExpr_ptr clone_res = std::dynamic_pointer_cast<SQLHexExpr>(clone_tmp);

  return clone_res;
}